package br.com.ff.veiculo.session;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.ejb.Local;
import javax.ejb.Stateless;

import br.com.ff.cliente.entidade.Cliente;
import br.com.ff.common.exception.EntidadeDuplicadaException;
import br.com.ff.commons.session.Repositorio;
import br.com.ff.tipoveiculo.entidade.TipoVeiculo;
import br.com.ff.veiculo.dao.VeiculoDAO;
import br.com.ff.veiculo.entidade.Veiculo;
import br.com.ff.veiculo.to.VeiculoTO;

@Stateless
@Local(VeiculoLocal.class)
public class VeiculoSessionBean implements VeiculoLocal {

	@EJB
	Repositorio repositorio;
	
	VeiculoDAO veiculoDAO;
	
	@SuppressWarnings("unused")
	@PostConstruct
	private void inicializar() {
		veiculoDAO = repositorio.getVeiculoDAO();
	}	
	
	public void atualizar(VeiculoTO veiculoTO)
			throws EntidadeDuplicadaException {
		
		validarSalvar(veiculoTO);
		
		Veiculo veiculo = (Veiculo)getVeiculoDAO().findById(Veiculo.class, veiculoTO.getId());
		
		veiculo.setCliente(new Cliente(veiculoTO.getCliente()));
		veiculo.setDescricao(veiculoTO.getDescricao());
		veiculo.setEquipamentoSrn(veiculoTO.getEquipamentoSrn());
		veiculo.setPlaca(veiculoTO.getPlaca());		
		veiculo.setStatus(veiculoTO.getStatus().getStatus());
		
		veiculo.setTipoVeiculo(new TipoVeiculo(veiculoTO.getTipoVeiculo()));

		getVeiculoDAO().salvar(veiculo);
		
	}

	private void validarSalvar(VeiculoTO veiculoTO) throws EntidadeDuplicadaException {

		List<VeiculoTO> veiculos = findByParams(veiculoTO);
		
		if (!veiculos.isEmpty() &&
					(!veiculos.get(0).getId().equals(veiculoTO.getId()))) {
			throw new EntidadeDuplicadaException("Ja existe veiculo com placa: " + veiculoTO.getPlaca());
		}
		
	}

	public VeiculoTO findById(Long id) {
		Veiculo veiculo = (Veiculo)getVeiculoDAO().findById(Veiculo.class, id);
		VeiculoTO result = veiculo.parseVeiculoTO();
		return result;
	}

	public List<VeiculoTO> findByParams(VeiculoTO veiculoTO) {
		
		Veiculo veiculoParam = new Veiculo(veiculoTO);
		
		List<Veiculo> veiculos = getVeiculoDAO().findByParams(veiculoParam);
		
		List<VeiculoTO> result = parseListTO(veiculos);
		return result;
		
	}

	private List<VeiculoTO> parseListTO(List<Veiculo> veiculos) {
		List<VeiculoTO> result = new ArrayList<VeiculoTO>();
		for (Veiculo veiculo : veiculos) {
			result.add(veiculo.parseVeiculoTO());
		}
		return result;
	}

	public void remover(Long id) {
		Veiculo veiculo = (Veiculo)getVeiculoDAO().findById(Veiculo.class, id);
		getVeiculoDAO().remover(veiculo);
	}

	public boolean salvar(VeiculoTO veiculoTO)
			throws EntidadeDuplicadaException {
		
		validarSalvar(veiculoTO);		
		
		Veiculo veiculo = new Veiculo(veiculoTO);
		veiculo.setDataCadastro(new Date());
		getVeiculoDAO().salvar(veiculo);
		return true;
	}
	
	public List<VeiculoTO> findVeiculoPorSerial(String serial) {
		
		List<Veiculo> veiculos = getVeiculoDAO().findVeiculoPorSerial(serial);
		
		List<VeiculoTO> result = parseListTO(veiculos);
		
		return result;
	}

	public VeiculoDAO getVeiculoDAO() {
		return veiculoDAO;
	}

	public void setVeiculoDAO(VeiculoDAO veiculoDAO) {
		this.veiculoDAO = veiculoDAO;
	}
}
